﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Xml;
using System.Windows;

namespace DisplayBoardInfoClient
{
    /// <summary>
    /// Klasa upraszczająca komunikację z serwerem. Posiada zaimplementowane wszystkie niezbędne akcje i zwraca jedynie wynik danej operacji.
    /// </summary>
    class ServerClient
    {
        /// <summary>
        /// Wysyła żądanie http "POST" pod wskazany adres wraz z treścią przekazaną jako argument.
        /// </summary>
        /// <param name="url">Adres, pod który należy wysłać żądanie</param>
        /// <param name="dataToSend">treść jaka musi zostać wysłana wraz z żądaniem</param>
        /// <returns>treść odpowiedzi uzyskanej w wytniku żądania w postaci ciągu tekstowego</returns>
        public static string sendRequestPOST(string url, string dataToSend)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
            //request.Credentials = new NetworkCredential(user, password);
            request.Method = WebRequestMethods.Http.Post;
            request.ContentType = "Application/xml; charset=utf-8";


            byte[] data = System.Text.Encoding.UTF8.GetBytes(dataToSend.ToCharArray());
            request.ContentLength = data.Length;
            Stream postStream = request.GetRequestStream();
            postStream.Write(data, 0, data.Length);
            postStream.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream()).ReadToEnd();
        }
        /// <summary>
        /// Wysyła żądanie http "GET" pod wskazany adres.
        /// </summary>
        /// <param name="url">Adres, pod który należy wysłać żądanie</param>
        /// <returns>treść odpowiedzi uzyskanej w wytniku żądania w postaci ciągu tekstowego</returns>
        public static string sendRequestGET(string url)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
            //request.Credentials = new NetworkCredential(user, password);
            request.Method = WebRequestMethods.Http.Get;
            request.ContentType = "Application/xml; charset=utf-8";

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream()).ReadToEnd();
        }
        /// <summary>
        /// Pobiera z serwera listę pacjentów i umieszcza w klasie "PatientList".
        /// </summary>
        public static void getPatientList()
        {
            string servResponse;
            try
            {
                servResponse = sendRequestGET(XMLConfiguration.get(Constants.SERVER_ADDR) + "patients/list");

                XmlDocument doc = new XmlDocument();
                doc.LoadXml(servResponse);
                PatientList.clear();
                foreach (XmlNode node in doc.GetElementsByTagName("patient"))
                {
                    PatientList.addPatient(new PatientList.Patient(((XmlElement)node).GetElementsByTagName("surname")[0].InnerText,
                        ((XmlElement)node).GetElementsByTagName("name")[0].InnerText,
                        ((XmlElement)node).GetElementsByTagName("pesel")[0].InnerText, ((XmlElement)node).GetElementsByTagName("id")[0].InnerText));
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Nie udało się pobrać listy pacjentów!");
            }
        }
        /// <summary>
        /// Pobiera z serwera listę pacjentów i zwraca w postaci obiektu zawierającego listę obiektów "Room".
        /// </summary>
        /// <returns></returns>
        public static List<Room> getRoomList()
        {
            string servResponse;
            List<Room> lista = new List<Room>();
            try
            {
                servResponse = sendRequestGET(XMLConfiguration.get(Constants.SERVER_ADDR) + "rooms/list");

                XmlDocument doc = new XmlDocument();
                doc.LoadXml(servResponse);
                foreach (XmlNode node in doc.GetElementsByTagName("room"))
                {
                    lista.Add(new Room(((XmlElement)node).GetElementsByTagName("id")[0].InnerText, ((XmlElement)node).GetElementsByTagName("number")[0].InnerText, ((XmlElement)node).GetElementsByTagName("name")[0].InnerText));

                }
                return lista;
            }
            catch (Exception)
            {
                MessageBox.Show("Nie udało się pobrać listy pokoi!");
                return null;
            }
        }
        /// <summary>
        /// Autoryzuje użytkownika na podstawie podanych danych. Wysyła żądanie do serwera z odpowiednim loginem i hashem z hasła
        /// otrzymując informacje o uprawnieniach konta jeżeli takowe istnieje. Zapisuje dane o zalogowanym 
        /// </summary>
        /// <param name="login">login użytkownika</param>
        /// <param name="hashPass">hash z hasła utworzony algorytmem SHA1</param>
        /// <returns>potwierdzenie, że takie konto istnieje w systemie lub nie</returns>
        internal static bool authorize(string login, string hashPass)
        {
            string servResponse;
            List<string> lista = new List<string>();
            XmlDocument doc2 = new XmlDocument();
            XmlElement loginElem = doc2.CreateElement("user");
            XmlElement logText = doc2.CreateElement("login");
            logText.InnerText = login;
            XmlElement passhashElemt = doc2.CreateElement("password");
            passhashElemt.InnerText = hashPass;
            loginElem.AppendChild(logText);
            loginElem.AppendChild(passhashElemt);
            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "login", loginElem.OuterXml);
                LoggedAs.login(servResponse);
                return true;
            }
            catch (Exception e)
            {
                if (e.Message.Equals("Unable to connect to the remote server"))
                {
                    MessageBox.Show("Brak połączenia z serwerem. Sprawdź połączenie z siecią lub adres serwera w pliku konfiguracyjnym.");
                    return false;
                }
                MessageBox.Show("Takie konto nie istnieje.");
                return false;
            }

        }
        /// <summary>
        /// Dodaje nową wizytę do bazy danych na serwerze. Wysyła komunikat i w przypadku błędu zwraca go użytkownikowi.
        /// </summary>
        /// <param name="visit">Obiekt zawierający informacje o wizycie</param>
        /// <param name="room">Obiekt zawierający informacje o pokoju, w którym zarejestrowana ma być wizyta.</param>
        /// <returns></returns>
        public static bool addVisit(PatientVisit visit, Room room)
        {

            string servResponse;

            XmlDocument doc2 = new XmlDocument();
            XmlElement rootElem = doc2.CreateElement("visit");
            //Room element creation
            XmlElement roomElem = doc2.CreateElement("room");
            XmlElement roomNumb = doc2.CreateElement("number");
            XmlElement roomName = doc2.CreateElement("name");
            XmlElement roomID = doc2.CreateElement("id");
            roomID.InnerText = room.ID;
            roomElem.AppendChild(roomID);
            roomNumb.InnerText = room.Number;
            roomName.InnerText = room.Name;
            roomElem.AppendChild(roomName);
            roomElem.AppendChild(roomNumb);
            rootElem.AppendChild(roomElem);

            //Patient elem creation

            XmlElement idElem = doc2.CreateElement("id");
            XmlElement patientElem = doc2.CreateElement("patient");
            XmlElement peselElem = doc2.CreateElement("pesel");
            XmlElement nameElem = doc2.CreateElement("name");
            XmlElement surnameElem = doc2.CreateElement("surname");

            idElem.InnerText = visit.Patient.ID;
            peselElem.InnerText = visit.Patient.PESEL;
            nameElem.InnerText = visit.Patient.Name;
            surnameElem.InnerText = visit.Patient.Surname;
            patientElem.AppendChild(idElem);
            patientElem.AppendChild(peselElem);
            patientElem.AppendChild(nameElem);
            patientElem.AppendChild(surnameElem);
            rootElem.AppendChild(patientElem);

            //DATE elem creation
            XmlElement dateElem = doc2.CreateElement("date");
            dateElem.InnerText = visit.VisitTime.ToShortDateString() + "T" + visit.VisitTime.ToShortTimeString() + ":00+02:00";
            rootElem.AppendChild(dateElem);


            //duration elem creation
            XmlElement durElem = doc2.CreateElement("duration");
            durElem.InnerText = "1970-01-01T" + visit.Duration.ToString() + "+02:00";
            rootElem.AppendChild(durElem);
            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "visits/add", rootElem.OuterXml);

                return true;
            }
            catch (WebException e)
            {
                if (((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.NotAcceptable)
                {
                    string resptext = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();
                    MessageBox.Show("Nie można dodać tej wizyty: " + resptext);

                }
                return false;
            }
            catch (Exception)
            {
                MessageBox.Show("Nie udało się dodać wizyty. Sprawdź połączenie z serwerem");
                return false;
            }

        }
        /// <summary>
        /// Pobiera listę wizyt na wskazany dzień, dla wskazanego pokoju po czym zapisuje ją w instancji klasy "DailyPlan".
        /// </summary>
        /// <param name="room">Pokój, dla którego należy pobrać wizyty</param>
        /// <param name="data">Dzień dla którego należy pobrać wizyty</param>
        /// <returns></returns>
        public static bool getDailyPlan(Room room, DateTime data)
        {
            string servResponse;

            XmlDocument doc2 = new XmlDocument();
            XmlElement rootElem = doc2.CreateElement("listVisits");
            XmlElement roomElem = doc2.CreateElement("room");
            XmlElement roomNumb = doc2.CreateElement("number");
            roomNumb.InnerText = room.Number;
            roomElem.AppendChild(roomNumb);
            XmlElement roomID = doc2.CreateElement("id");
            roomID.InnerText = room.ID;
            roomElem.AppendChild(roomID);
            rootElem.AppendChild(roomElem);

            XmlElement dateElem = doc2.CreateElement("date");
            dateElem.InnerText = data.ToShortDateString();
            rootElem.AppendChild(dateElem);
            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "visits/list", rootElem.OuterXml);
                DailyPlan.init(servResponse);
                return true;
            }
            catch (Exception)
            {
                MessageBox.Show("Nie udało się pobrać listy vizyt poprawnie!");
                return false;
            }
        }
        /// <summary>
        /// Dodaje nowego pacjenta do bazy danych.
        /// </summary>
        /// <param name="name">Imię pacjenta</param>
        /// <param name="surname">Nazwisko pacjenta</param>
        /// <param name="pesel">PESEL pacjenta</param>
        /// <returns>informacja czy dodanie pacjenta się powiodło czy nie</returns>
        public static bool addPatient(string name, string surname, string pesel)
        {
            string servResponse;

            XmlDocument doc2 = new XmlDocument();
            //Patient elem creation
            XmlElement patientElem = doc2.CreateElement("patient");
            XmlElement peselElem = doc2.CreateElement("pesel");
            XmlElement nameElem = doc2.CreateElement("name");
            XmlElement surnameElem = doc2.CreateElement("surname");

            peselElem.InnerText = pesel;
            nameElem.InnerText = name;
            surnameElem.InnerText = surname;

            patientElem.AppendChild(peselElem);
            patientElem.AppendChild(nameElem);
            patientElem.AppendChild(surnameElem);

            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "patients/add", patientElem.OuterXml);
                //GET the patient ID
                getPatientList();
                //PatientList.addPatient(patient);
                return true;
            }
            catch (Exception)
            {
                MessageBox.Show("Nie udało się dodać pacjenta sprawdź połączenie z serwerem!");
                return false;
            }
        }

        /// <summary>
        /// Usuwa wizytę z bazy danych serwera.
        /// </summary>
        /// <param name="patientVisit">obiekt wizyty, którą należy usunąć</param>
        /// <param name="room">pokój  w którym wizyta została zarejestrowana</param>
        /// <returns></returns>
        internal static bool delVisit(PatientVisit patientVisit, Room room)
        {
            string servResponse;

            XmlDocument doc2 = new XmlDocument();
            XmlElement rootElem = doc2.CreateElement("visit");
            /*//Room element creation
            XmlElement roomElem = doc2.CreateElement("room");
            XmlElement roomNumb = doc2.CreateElement("number");
            XmlElement roomName = doc2.CreateElement("name");
            XmlElement roomID = doc2.CreateElement("id");
            roomID.InnerText = room.ID;
            roomElem.AppendChild(roomID);
            roomNumb.InnerText = room.Number;
            roomName.InnerText = room.Name;
            roomElem.AppendChild(roomName);
            roomElem.AppendChild(roomNumb);
            rootElem.AppendChild(roomElem);*/

            //IDadd

            XmlElement visitIdElem = doc2.CreateElement("id");
            visitIdElem.InnerText = patientVisit.ID;
            rootElem.AppendChild(visitIdElem);



            //Patient elem creation

            XmlElement idElem = doc2.CreateElement("id");
            XmlElement patientElem = doc2.CreateElement("patient");
            XmlElement peselElem = doc2.CreateElement("pesel");
            XmlElement nameElem = doc2.CreateElement("name");
            XmlElement surnameElem = doc2.CreateElement("surname");

            idElem.InnerText = patientVisit.Patient.ID;
            peselElem.InnerText = patientVisit.Patient.PESEL;
            nameElem.InnerText = patientVisit.Patient.Name;
            surnameElem.InnerText = patientVisit.Patient.Surname;
            patientElem.AppendChild(idElem);
            patientElem.AppendChild(peselElem);
            patientElem.AppendChild(nameElem);
            patientElem.AppendChild(surnameElem);
            rootElem.AppendChild(patientElem);

            //DATE elem creation
            XmlElement dateElem = doc2.CreateElement("date");
            dateElem.InnerText = patientVisit.VisitTime.ToShortDateString() + "T" + patientVisit.VisitTime.ToShortTimeString() + ":00+02:00";
            rootElem.AppendChild(dateElem);


            //duration elem creation
            XmlElement durElem = doc2.CreateElement("duration");
            durElem.InnerText = "1970-01-01T" + patientVisit.Duration.ToString() + "+02:00";
            rootElem.AppendChild(durElem);
            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "visits/delete", rootElem.OuterXml);

                return true;
            }
            catch (WebException e)
            {
                if (((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.NotAcceptable)
                    MessageBox.Show("Nie można usunąć tej wizyty.");
                return false;
            }
        }
        /// <summary>
        /// Modyfikuje informacje o wizycie zarejestrowanej wcześniej w bazie danych.
        /// </summary>
        /// <param name="patientVisit">Nowy obiekt, który zawiera informacje mające zastąpić dane w bazie danych.</param>
        /// <param name="room">Pokój, dla którego wizyta została zarejestrowana.</param>
        /// <returns>informacja czy modyfikacja się powiodła czy nie</returns>
        internal static bool modifyVisit(PatientVisit patientVisit, Room room)
        {
            string servResponse;


            XmlDocument doc2 = new XmlDocument();
            XmlElement rootElem = doc2.CreateElement("visit");

            XmlElement visitIdElem = doc2.CreateElement("id");
            visitIdElem.InnerText = patientVisit.ID;
            rootElem.AppendChild(visitIdElem);
            //Room element creation
            XmlElement roomElem = doc2.CreateElement("room");
            XmlElement roomNumb = doc2.CreateElement("number");
            XmlElement roomName = doc2.CreateElement("name");
            XmlElement roomID = doc2.CreateElement("id");
            roomID.InnerText = room.ID;
            roomElem.AppendChild(roomID);
            roomNumb.InnerText = room.Number;
            roomName.InnerText = room.Name;
            roomElem.AppendChild(roomName);
            roomElem.AppendChild(roomNumb);
            rootElem.AppendChild(roomElem);



            //Patient elem creation

            XmlElement idElem = doc2.CreateElement("id");
            XmlElement patientElem = doc2.CreateElement("patient");
            XmlElement peselElem = doc2.CreateElement("pesel");
            XmlElement nameElem = doc2.CreateElement("name");
            XmlElement surnameElem = doc2.CreateElement("surname");

            idElem.InnerText = patientVisit.Patient.ID;
            peselElem.InnerText = patientVisit.Patient.PESEL;
            nameElem.InnerText = patientVisit.Patient.Name;
            surnameElem.InnerText = patientVisit.Patient.Surname;
            patientElem.AppendChild(idElem);
            patientElem.AppendChild(peselElem);
            patientElem.AppendChild(nameElem);
            patientElem.AppendChild(surnameElem);
            rootElem.AppendChild(patientElem);

            //DATE elem creation
            XmlElement dateElem = doc2.CreateElement("date");
            dateElem.InnerText = patientVisit.VisitTime.ToShortDateString() + "T" + patientVisit.VisitTime.ToShortTimeString() + ":00+02:00";
            rootElem.AppendChild(dateElem);


            //duration elem creation
            XmlElement durElem = doc2.CreateElement("duration");
            durElem.InnerText = "1970-01-01T" + patientVisit.Duration.ToString() + "+02:00";
            rootElem.AppendChild(durElem);
            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "visits/modify", rootElem.OuterXml);

                return true;
            }
            catch (WebException e)
            {
                if (((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.NotAcceptable)
                    MessageBox.Show("Nie można zmodyfikować tej wizyty.");
                string resptext = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();
                return false;
            }
        }
        /// <summary>
        /// Rejestruje usługę nasłuchującą u serwera na otrzymywanie informacji o zmianach w wizytach dla danego pokoju.
        /// </summary>
        /// <param name="ip">ip usługi nasłuchującej</param>
        /// <param name="port">port usługi nasłuchującej</param>
        /// <param name="room">pokój dla którego zmiany w wizytach powinny być uaktualniane</param>
        /// <returns></returns>
        public static bool registerForUpdates(string ip, string port, Room room)
        {
            string servResponse;

            XmlDocument doc2 = new XmlDocument();
            XmlElement rootElem = doc2.CreateElement("registeredForUpdates");
            //Room element creation
            XmlElement roomElem = doc2.CreateElement("room");
            XmlElement roomNumb = doc2.CreateElement("number");
            XmlElement roomName = doc2.CreateElement("name");
            XmlElement roomID = doc2.CreateElement("id");
            roomID.InnerText = room.ID;
            roomElem.AppendChild(roomID);
            roomNumb.InnerText = room.Number;
            roomName.InnerText = room.Name;
            roomElem.AppendChild(roomName);
            roomElem.AppendChild(roomNumb);
            rootElem.AppendChild(roomElem);

            //Rest
            XmlElement ipElem = doc2.CreateElement("ip");
            ipElem.InnerText = ip;
            rootElem.AppendChild(ipElem);
            XmlElement portElem = doc2.CreateElement("port");
            portElem.InnerText = port;
            rootElem.AppendChild(portElem);
            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "updates/register", rootElem.OuterXml);
                return true;
            }
            catch (WebException e)
            {
                //if (((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.NotAcceptable)
                //     MessageBox.Show("Nie można usunąć tej wizyty.");
                string resptext = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();
                return false;
            }

        }
        public static bool unregisterForUpdates(string ip, string port, Room room)
        {
            string servResponse;

            XmlDocument doc2 = new XmlDocument();
            XmlElement rootElem = doc2.CreateElement("registeredForUpdates");
            //Room element creation
            XmlElement roomElem = doc2.CreateElement("room");
            XmlElement roomNumb = doc2.CreateElement("number");
            XmlElement roomName = doc2.CreateElement("name");
            XmlElement roomID = doc2.CreateElement("id");
            roomID.InnerText = room.ID;
            roomElem.AppendChild(roomID);
            roomNumb.InnerText = room.Number;
            roomName.InnerText = room.Name;
            roomElem.AppendChild(roomName);
            roomElem.AppendChild(roomNumb);
            rootElem.AppendChild(roomElem);

            //Rest
            XmlElement ipElem = doc2.CreateElement("ip");
            ipElem.InnerText = ip;
            rootElem.AppendChild(ipElem);
            XmlElement portElem = doc2.CreateElement("port");
            portElem.InnerText = port;
            rootElem.AppendChild(portElem);
            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "updates/unregister", rootElem.OuterXml);
                return true;
            }
            catch (WebException e)
            {
                //if (((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.NotAcceptable)
                     MessageBox.Show("Nie można usunąć tej wizyty.");
                string resptext = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();
                return false;
            }

        }
        /// <summary>
        /// Modyfikuje pacjenta w bazie danych.
        /// </summary>
        /// <param name="name">Nowe imię pacjenta</param>
        /// <param name="surname">Nowe nazwisko pacjenta</param>
        /// <param name="pesel">Numer pesel pacjenta</param>
        /// <param name="id">identyfikator pacjenta w bazie danych</param>
        /// <returns>Wynik modyfikacji pacjenta</returns>
        public static bool modifyPatient(string name, string surname, string pesel, string id)
        {
            string servResponse;

            XmlDocument doc2 = new XmlDocument();
            //Patient elem creation
            XmlElement patientElem = doc2.CreateElement("patient");
            XmlElement idElem = doc2.CreateElement("id");
            XmlElement peselElem = doc2.CreateElement("pesel");
            XmlElement nameElem = doc2.CreateElement("name");
            XmlElement surnameElem = doc2.CreateElement("surname");

            idElem.InnerText = id;
            peselElem.InnerText = pesel;
            nameElem.InnerText = name;
            surnameElem.InnerText = surname;

            patientElem.AppendChild(idElem);
            patientElem.AppendChild(peselElem);
            patientElem.AppendChild(nameElem);
            patientElem.AppendChild(surnameElem);


            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "patients/modify", patientElem.OuterXml);
                //GET the patient ID
                getPatientList();
                //PatientList.addPatient(patient);
                return true;
            }
            catch (Exception)
            {
                MessageBox.Show("Nie udało się zmodyfikować pacjenta sprawdź połączenie z serwerem!");
                return false;
            }
        }
        /// <summary>
        /// Zgłasza zakończenie wizyty danego pacjenta.
        /// </summary>
        /// <param name="patientVisit">Obiekt zawierający informacje o zakończonej wizycie</param>
        /// <param name="room">Obiekt zawierajacy informacje o pokoju w którym była wizyta</param>
        /// <returns>wynik zakończenia wizyty</returns>
        internal static bool finishVisit(PatientVisit patientVisit, Room room, bool outOfQue)
        {
            string servResponse;


            XmlDocument doc2 = new XmlDocument();
            XmlElement rootElem = doc2.CreateElement("finishVisit");
            XmlElement visitElem = doc2.CreateElement("visit");
            //Room element creation

            XmlElement visitIdElem = doc2.CreateElement("id");
            visitIdElem.InnerText = patientVisit.ID;
            visitElem.AppendChild(visitIdElem);

            XmlElement roomElem = doc2.CreateElement("room");
            XmlElement roomNumb = doc2.CreateElement("number");
            XmlElement roomName = doc2.CreateElement("name");
            XmlElement roomID = doc2.CreateElement("id");
            roomID.InnerText = room.ID;
            roomElem.AppendChild(roomID);
            roomNumb.InnerText = room.Number;
            roomName.InnerText = room.Name;
            roomElem.AppendChild(roomName);
            roomElem.AppendChild(roomNumb);
            visitElem.AppendChild(roomElem);



            //Patient elem creation

            XmlElement idElem = doc2.CreateElement("id");
            XmlElement patientElem = doc2.CreateElement("patient");
            XmlElement peselElem = doc2.CreateElement("pesel");
            XmlElement nameElem = doc2.CreateElement("name");
            XmlElement surnameElem = doc2.CreateElement("surname");

            idElem.InnerText = patientVisit.Patient.ID;
            peselElem.InnerText = patientVisit.Patient.PESEL;
            nameElem.InnerText = patientVisit.Patient.Name;
            surnameElem.InnerText = patientVisit.Patient.Surname;
            patientElem.AppendChild(idElem);
            patientElem.AppendChild(peselElem);
            patientElem.AppendChild(nameElem);
            patientElem.AppendChild(surnameElem);
            visitElem.AppendChild(patientElem);

            //DATE elem creation
            XmlElement dateElem = doc2.CreateElement("date");
            dateElem.InnerText = patientVisit.VisitTime.ToShortDateString() + "T" + patientVisit.VisitTime.ToShortTimeString() + ":00+02:00";
            visitElem.AppendChild(dateElem);

            //duration elem creation
            XmlElement durElem = doc2.CreateElement("duration");
            durElem.InnerText = "1970-01-01T" + patientVisit.Duration.ToString() + "+02:00";
            visitElem.AppendChild(durElem);

            XmlElement outofqueue = doc2.CreateElement("outOfQueue");
            outofqueue.InnerText = outOfQue.ToString();

            rootElem.AppendChild(outofqueue);
            rootElem.AppendChild(visitElem);
            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "visits/finish", rootElem.OuterXml);

                return true;
            }
            catch (WebException e)
            {
                if (((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.NotAcceptable)
                    MessageBox.Show("Nie można zatwierdzić tej wizyty.");
                string resptext = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();
                return false;
            }
            catch (Exception e)
            {
                MessageBox.Show("Zatwierdzanie wizyty rzuciło wyjątkiem: "+e.Message);
                return false;
            }
        }
        public static bool getRoomOpening(Room room)
        {
            string servResponse;

            XmlDocument doc2 = new XmlDocument();
            XmlElement rootElem = doc2.CreateElement("room");
            XmlElement roomNumb = doc2.CreateElement("number");
            roomNumb.InnerText = room.Number;
            
            XmlElement roomID = doc2.CreateElement("id");
            roomID.InnerText = room.ID;
            rootElem.AppendChild(roomID);
            rootElem.AppendChild(roomNumb);
            try
            {
                servResponse = sendRequestPOST(XMLConfiguration.get(Constants.SERVER_ADDR) + "admissions/list", rootElem.OuterXml);
                DailyPlan.openingHours(servResponse);
                return true;
            }
            catch (Exception)
            {
                MessageBox.Show("Nie udało się pobrać godzin otwarcia poprawnie!");
                return false;
            }

        }


    }
}
